/**
 * 资产类型组件 下拉列表结构
 * by zhanghaitao
 * create 2022-2-15
 */
import React from 'react';
import PropTypes from 'prop-types';
import { TreeSelectC } from '../../../comps';
import config from '../../../comps/business/tradingDirect/treeConfig';
import _ from 'lodash';

class BusinessType extends React.PureComponent {
  // props默认值
  static defaultProps = {
    title: '资产类型',
    placeholder: '请选择资产类型',
    initialValue: undefined, // 默认无初始化值
    onChange: () => {},
    onRef: () => {}, // 本组件的引用
    rules: undefined, // 默认无校验规则
    allowClear: true, // 默认可删除
    disabled: false, // 默认不禁用
    treeExpandedKeys: [],
  };

  state = {
    dataSource: [],
  };

  componentDidMount() {
    // 父组件对本组件的引用
    this.props.onRef(this);

    // 根据场景，初始化下拉数据
    this.initDirect(this.props.appType);

    // 若有初始化数据，抛出onChange事件
    if (this.props.initialValue) {
      this.onChange(this.props.initialValue);
    }
  }

  // 根据场景，初始化下拉数据
  initDirect = (appType) => {
    // 从配置文件中匹配出需要的业务类型
    const ds = [];
    const TradingClassif = _.cloneDeep(config);
    TradingClassif.forEach((item) => {
      // config中未配置appType的，适配所有业务
      if (item.appType == undefined) {
        ds.push(item);
      } else {
        // config中配置了appType的，根据入参判断是否应该展示
        if (item.appType.indexOf(appType) >= 0) {
          if (item.children) {
            item.children = item.children.filter((text) => text.appType.indexOf(appType) >= 0);
          }
          ds.push(item);
        }
      }
    });
    this.setState({
      dataSource: ds,
    });
  };

  // 业务类型切换事件
  onChange = (e) => {
    // 对外抛出事件
    const value = [];
    let result;
    this.state.dataSource.forEach((item) => {
      if (item.value == e) {
        if (item.children) {
          item.children.forEach((val) => {
            value.push(val.value);
          });
        }
      }
    });
    if (value.length == 0) {
      result = e;
    } else {
      result = value;
    }
    this.props.onChange(result);
  };

  // 记录展开的节点
  treeExpand = (e) => {
    this.setState({ treeExpandedKeys: e });
  };

  // 关闭所有展开的节点
  clear = () => {
    this.setState({ treeExpandedKeys: [] });
  };

  render() {
    const { dataIndex, title, placeholder, allowClear, disabled, initialValue } = this.props;
    return (
      <TreeSelectC
        dataIndex={dataIndex}
        form={this.props.form}
        title={title}
        dataSource={this.state.dataSource}
        allowClear={allowClear}
        placeholder={placeholder}
        onChange={this.onChange}
        disabled={disabled}
        initialValue={initialValue}
        onTreeExpand={(e) => {
          this.treeExpand(e);
        }}
        treeExpandedKeys={this.state.treeExpandedKeys}
      />
    );
  }
}

// props类型
BusinessType.propsTypes = {
  title: PropTypes.string, // 显示名称
  dataIndex: PropTypes.string, // Form识别的Item ID
  placeholder: PropTypes.string, // 占位符
  initialValue: PropTypes.string, // 初始默认值
  onChange: PropTypes.func, // 输入框内容变化时的回调
  onRef: PropTypes.func, // 本组件的引用（可用来父组件调用内部方法）
  rules: PropTypes.object, // 校验规则
  allowClear: PropTypes.bool, // 设置是否可删除
  disabled: PropTypes.bool, // 是否禁用
  appType: PropTypes.string, // 0-仅指令  1-仅簿记管理  2-仅簿记交易交收  3-仅簿记行为交收
};

export default BusinessType;
